﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Infrastructure.Helper
{
    /// <summary>
    /// 提供用于执行 Shell 命令的帮助方法，支持 Bash 和 Cmd 命令的执行。
    /// </summary>
    public class ShellHelper
    {
        /// <summary>
        /// 执行一个 Bash 命令并返回其输出结果。
        /// </summary>
        /// <param name="command">要执行的 Bash 命令</param>
        /// <returns>命令执行的输出结果</returns>
        public static string Bash(string command)
        {
            // 转义双引号以确保命令正确处理
            string text = command.Replace("\"", "\\\"");

            // 配置进程启动信息
            Process process = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "/bin/bash",  // Bash Shell 的路径
                    Arguments = "-c \"" + text + "\"",  // 使用 -c 参数执行命令
                    RedirectStandardOutput = true,  // 重定向标准输出，以便获取命令输出
                    UseShellExecute = false,  // 禁止使用外壳执行
                    CreateNoWindow = true  // 不创建窗口
                }
            };

            process.Start();  // 启动进程
            string result = process.StandardOutput.ReadToEnd();  // 读取命令输出
            process.WaitForExit();  // 等待进程退出
            process.Dispose();  // 清理进程资源

            return result;  // 返回命令输出
        }

        /// <summary>
        /// 执行一个命令行程序并返回其输出结果。
        /// </summary>
        /// <param name="fileName">要执行的程序的路径</param>
        /// <param name="args">传递给程序的参数</param>
        /// <returns>程序执行的输出结果</returns>
        public static string Cmd(string fileName, string args)
        {
            string result = string.Empty;

            // 配置进程启动信息
            ProcessStartInfo processStartInfo = new ProcessStartInfo
            {
                FileName = fileName,  // 程序路径
                Arguments = args,  // 命令行参数
                RedirectStandardOutput = true  // 重定向标准输出，以便获取命令输出
            };

            // 启动进程并读取输出
            using (Process process = Process.Start(processStartInfo))
            {
                result = process.StandardOutput.ReadToEnd();  // 读取标准输出
            }

            return result;  // 返回命令输出
        }
    }
}
